package org.cybzacg.encryption.monitoring;

import org.cybzacg.encryption.monitoring.metrics.EncryptionMetrics;
import org.cybzacg.encryption.monitoring.metrics.PerformanceMetrics;
import org.cybzacg.encryption.monitoring.metrics.SecurityMetrics;

/**
 * 性能监控接口
 * 提供加密操作的性能监控和指标收集功能
 * 
 * @author encryption team
 * @version 1.0
 */
public interface PerformanceMonitor {
    
    /**
     * 开始监控操作
     * 
     * @param operationName 操作名称
     * @return 操作上下文
     */
    OperationContext startOperation(String operationName);
    
    /**
     * 结束监控操作
     * 
     * @param context 操作上下文
     * @param success 是否成功
     */
    void endOperation(OperationContext context, boolean success);
    
    /**
     * 记录加密操作
     * 
     * @param algorithm 算法名称
     * @param dataSize 数据大小
     * @param duration 耗时（毫秒）
     * @param success 是否成功
     */
    void recordEncryption(String algorithm, long dataSize, long duration, boolean success);
    
    /**
     * 记录解密操作
     * 
     * @param algorithm 算法名称
     * @param dataSize 数据大小
     * @param duration 耗时（毫秒）
     * @param success 是否成功
     */
    void recordDecryption(String algorithm, long dataSize, long duration, boolean success);
    
    /**
     * 记录签名操作
     * 
     * @param algorithm 算法名称
     * @param dataSize 数据大小
     * @param duration 耗时（毫秒）
     * @param success 是否成功
     */
    void recordSignature(String algorithm, long dataSize, long duration, boolean success);
    
    /**
     * 记录验证操作
     * 
     * @param algorithm 算法名称
     * @param dataSize 数据大小
     * @param duration 耗时（毫秒）
     * @param success 是否成功
     */
    void recordVerification(String algorithm, long dataSize, long duration, boolean success);
    
    /**
     * 获取加密指标
     * 
     * @return 加密指标
     */
    EncryptionMetrics getEncryptionMetrics();
    
    /**
     * 获取性能指标
     * 
     * @return 性能指标
     */
    PerformanceMetrics getPerformanceMetrics();
    
    /**
     * 获取安全指标
     * 
     * @return 安全指标
     */
    SecurityMetrics getSecurityMetrics();
    
    /**
     * 重置所有指标
     */
    void resetMetrics();
    
    /**
     * 启用/禁用监控
     * 
     * @param enabled 是否启用
     */
    void setEnabled(boolean enabled);
    
    /**
     * 检查监控是否启用
     * 
     * @return 是否启用
     */
    boolean isEnabled();
    
    /**
     * 操作上下文接口
     */
    interface OperationContext {
        
        /**
         * 获取操作名称
         * 
         * @return 操作名称
         */
        String getOperationName();
        
        /**
         * 获取开始时间
         * 
         * @return 开始时间戳
         */
        long getStartTime();
        
        /**
         * 获取操作数据
         * 
         * @return 操作数据
         */
        Object getData();
        
        /**
         * 设置操作数据
         * 
         * @param data 操作数据
         */
        void setData(Object data);
    }
}
